Intersection Observerã䜿çšããŠããã³ããšã³ãã³ã³ããŒãã³ããé å»¶èªã¿èŸŒã¿ãããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãæé©åãUXãåäžãããåæèªã¿èŸŒã¿æéãççž®ãã³ãŒãäŸãšãã¹ããã©ã¯ãã£ã¹ã玹ä»ããŸãã
Intersection Observerãå©çšããããã³ããšã³ãã³ã³ããŒãã³ãã®é å»¶èªã¿èŸŒã¿ïŒè©³çŽ°è§£èª¬
仿¥ã®ãŠã§ãéçºã®äžçã§ã¯ãé«éã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããšãæãéèŠã§ãããŠãŒã¶ãŒã¯ãŠã§ããµã€ããçŽ æ©ãèªã¿èŸŒãŸããã·ãŒã ã¬ã¹ã«æäœã§ããããšãæåŸ ããŠããŸãããããå®çŸããããã®éèŠãªãã¯ããã¯ã®äžã€ããç¹ã«ããã³ããšã³ãã³ã³ããŒãã³ãã«ãããé å»¶èªã¿èŸŒã¿ã§ãããã®èšäºã§ã¯ãIntersection Observer APIã䜿çšããå ç¢ãªå®è£ ã«çŠç¹ãåœãŠãã³ã³ããŒãã³ãã®é å»¶èªã¿èŸŒã¿ã®äžçãæ·±ãæãäžããŠãããŸãã
é å»¶èªã¿èŸŒã¿ãšã¯ïŒ
é å»¶èªã¿èŸŒã¿ã¯ããªãœãŒã¹ïŒç»åãåç»ãiframeããããã¯ã³ã³ããŒãã³ãå šäœïŒã®èªã¿èŸŒã¿ãããã¥ãŒããŒãã«å ¥ãããšãããšããªã©ãå®éã«å¿ èŠã«ãªããŸã§å»¶æããæé©åæè¡ã§ããæåã«ãã¹ãŠãèªã¿èŸŒããšåæããŒãžã®èªã¿èŸŒã¿æéãå€§å¹ ã«å¢å ããå¯èœæ§ããããŸãããé å»¶èªã¿èŸŒã¿ã§ã¯ãªãœãŒã¹ããªã³ããã³ãã§èªã¿èŸŒã¿ãŸãã
倿°ã®ç»åãããé·ãããŒãžãæ³åããŠã¿ãŠãã ãããé å»¶èªã¿èŸŒã¿ããªããã°ããŠãŒã¶ãŒãã¹ã¯ããŒã«ããŠãããã®ç»åãèŠããã©ããã«é¢ãããããã¹ãŠã®ç»åãããŠã³ããŒããããŸããé å»¶èªã¿èŸŒã¿ã䜿ãã°ããŠãŒã¶ãŒãã¹ã¯ããŒã«ããŠè¡šç€ºããããšãããšãã«ã®ã¿ç»åãããŠã³ããŒããããŸããããã«ãããåæèªã¿èŸŒã¿æéãåçã«ççž®ããããŠãŒã¶ãŒãšãµãŒããŒã®äž¡æ¹ã§åž¯åå¹ ãç¯çŽãããŸãã
ãªãããã³ããšã³ãã³ã³ããŒãã³ããé å»¶èªã¿èŸŒã¿ããã®ãïŒ
é å»¶èªã¿èŸŒã¿ã¯ç»åã ãã®ãã®ã§ã¯ãããŸãããç¹ã«å€ãã®äŸåé¢ä¿ãéãã¬ã³ããªã³ã°ããžãã¯ãæã€è€éãªããã³ããšã³ãã³ã³ããŒãã³ãã«å¯ŸããŠãåæ§ã«å¹æçã§ãããããã®ã³ã³ããŒãã³ããå¿ èŠãªãšãã«ã®ã¿èªã¿èŸŒãããšã§ãåæããŒãžã®èªã¿èŸŒã¿æéãšãŠã§ããµã€ãå šäœã®ããã©ãŒãã³ã¹ãåçã«æ¹åã§ããŸãã
ããã³ããšã³ãã³ã³ããŒãã³ããé å»¶èªã¿èŸŒã¿ããäž»ãªå©ç¹ã¯æ¬¡ã®ãšããã§ãïŒ
- åæèªã¿èŸŒã¿æéã®æ¹åïŒéèŠã§ãªãã³ã³ããŒãã³ãã®èªã¿èŸŒã¿ãé ãããããšã§ããã©ãŠã¶ã¯æåã«ã³ã¢ã³ã³ãã³ãã®ã¬ã³ããªã³ã°ã«éäžã§ããããéããååãã€ã³ããŸã§ã®æéããšããè¯ãåæãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ã€ãªãããŸãã
- 垯åå¹ æ¶è²»ã®åæžïŒå¿ èŠãªã³ã³ããŒãã³ãã®ã¿ãèªã¿èŸŒãŸããããããŠãŒã¶ãŒãšãµãŒããŒã®äž¡æ¹ã§åž¯åå¹ ãç¯çŽãããŸããããã¯ç¹ã«ã¢ãã€ã«ããã€ã¹ãã€ã³ã¿ãŒãããæ¥ç¶ãéãããŠãããŠãŒã¶ãŒã«ãšã£ãŠéèŠã§ãã
- ããã©ãŒãã³ã¹ã®åäžïŒé å»¶èªã¿èŸŒã¿ã«ãããæåã«è§£æã»å®è¡ããå¿ èŠãããJavaScriptã®éãæžããããã¹ã ãŒãºãªã¢ãã¡ãŒã·ã§ã³ãããéãã€ã³ã¿ã©ã¯ã·ã§ã³ããããŠããå¿çæ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã«ã€ãªãããŸãã
- ãªãœãŒã¹ç®¡çã®æ¹åïŒå¿ èŠãªãšãã«ã®ã¿ã³ã³ããŒãã³ããèªã¿èŸŒãããšã§ããã©ãŠã¶ã¯ãªãœãŒã¹ãããå¹ççã«å²ãåœãŠãããšãã§ããå šäœçãªããã©ãŒãã³ã¹ãåäžããŸãã
Intersection Observer APIïŒé å»¶èªã¿èŸŒã¿ã®ããã®åŒ·åãªããŒã«
Intersection Observer APIã¯ãèŠçŽ ããã¥ãŒããŒãã«åºå ¥ãããã¿ã€ãã³ã°ãå¹ççãã€ç¢ºå®ã«æ€åºããæ¹æ³ãæäŸãããã©ãŠã¶APIã§ããããã«ãããã¿ãŒã²ããèŠçŽ ãšç¥å èŠçŽ ãŸãã¯ããã¥ã¡ã³ãã®ãã¥ãŒããŒããšã®äº€å·®éšåã®å€åãç£èŠã§ããŸãã
ã¹ã¯ããŒã«ã€ãã³ããªã¹ããŒãèŠçŽ äœçœ®ã®æåèšç®ã«äŸåããåŸæ¥ã®ã¢ãããŒããšã¯ç°ãªããIntersection Observer APIã¯éåæã§ãããèšç®ãããã¯ã°ã©ãŠã³ãã§å®è¡ãããããã¡ã€ã³ã¹ã¬ãããžã®åœ±é¿ãæå°éã«æããã¹ã ãŒãºãªã¹ã¯ããŒã«ãšå¿çæ§ã確ä¿ããŸãã
Intersection Observer APIã®äž»ãªç¹åŸŽïŒ
- éåæïŒIntersection Observerã®èšç®ã¯éåæã«å®è¡ãããããã©ãŒãã³ã¹ã®ããã«ããã¯ãé²ããŸãã
- å¹ççïŒãã€ãã£ãã®ãã©ãŠã¶æé©åã䜿çšããŠäº€å·®ãæ€åºããCPU䜿çšçãæå°éã«æããŸãã
- èšå®å¯èœïŒã«ãŒãèŠçŽ ãã«ãŒãããŒãžã³ãéŸå€ãªã©ã®ãªãã·ã§ã³ã§ãªãã¶ãŒããŒãã«ã¹ã¿ãã€ãºã§ããŸãã
- æè»ïŒãã¥ãŒããŒããŸãã¯å¥ã®èŠçŽ ãšã®äº€å·®ãç£èŠããããã«äœ¿çšã§ããŸãã
Intersection Observerã䜿çšããé å»¶èªã¿èŸŒã¿ã®å®è£ ïŒã¹ããããã€ã¹ãããã¬ã€ã
以äžã«ãIntersection Observer APIã䜿çšããŠããã³ããšã³ãã³ã³ããŒãã³ãã®é å»¶èªã¿èŸŒã¿ãå®è£ ããããã®è©³çްãªã¬ã€ãã瀺ããŸãïŒ
1. ãã¬ãŒã¹ãã«ããŒèŠçŽ ã®äœæ
ãŸããã³ã³ããŒãã³ããèªã¿èŸŒãŸããåã«ããã衚ããã¬ãŒã¹ãã«ããŒèŠçŽ ãäœæããå¿
èŠããããŸãããã®ãã¬ãŒã¹ãã«ããŒã¯ãããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãã¹ã±ã«ãã³UIãæã€åçŽãª<div>ã«ããããšãã§ããŸãããã®èŠçŽ ã¯æåã«DOMã«ã¬ã³ããªã³ã°ãããŸãã
<div class="component-placeholder" data-component-name="MyComponent">
<!-- Loading indicator or skeleton UI -->
<p>Loading...</p>
</div>
2. Intersection Observerã®å®çŸ©
次ã«ãIntersection Observerã€ã³ã¹ã¿ã³ã¹ãäœæããå¿ èŠããããŸããã³ã³ã¹ãã©ã¯ã¿ãŒã¯2ã€ã®åŒæ°ãåããŸãïŒ
- callbackïŒã¿ãŒã²ããèŠçŽ ãã«ãŒãèŠçŽ ïŒãŸãã¯ãã¥ãŒããŒãïŒãšäº€å·®ãããšãã«å®è¡ããã颿°ã
- optionsïŒãªãã¶ãŒããŒã®åäœãã«ã¹ã¿ãã€ãºã§ãããªãã·ã§ã³ã®ãªããžã§ã¯ãã
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
// Load the component
const placeholder = entry.target;
const componentName = placeholder.dataset.componentName;
// Load the component based on the componentName
loadComponent(componentName, placeholder);
// Stop observing the placeholder
observer.unobserve(placeholder);
}
});
}, {
root: null, // Use the viewport as the root
rootMargin: '0px', // No margin around the root
threshold: 0.1 // Trigger when 10% of the element is visible
});
解説ïŒ
entriesïŒIntersectionObserverEntryãªããžã§ã¯ãã®é åã§ãåãªããžã§ã¯ãã¯ã¿ãŒã²ããèŠçŽ ã®äº€å·®ç¶æ ã®å€åã衚ããŸããobserverïŒIntersectionObserverã€ã³ã¹ã¿ã³ã¹èªäœãentry.isIntersectingïŒã¿ãŒã²ããèŠçŽ ãçŸåšã«ãŒãèŠçŽ ãšäº€å·®ããŠãããã©ããã瀺ãããŒã«å€ãplaceholder.dataset.componentNameïŒããŒã¿å±æ§ããã³ã³ããŒãã³ãåã«ã¢ã¯ã»ã¹ããŸããããã«ãããæ£ããã³ã³ããŒãã³ããåçã«èªã¿èŸŒãããšãã§ããŸããloadComponent(componentName, placeholder)ïŒïŒåŸã§å®çŸ©ããïŒã³ã³ããŒãã³ãã®å®éã®èªã¿èŸŒã¿ãåŠçãã颿°ãobserver.unobserve(placeholder)ïŒã³ã³ããŒãã³ããèªã¿èŸŒãŸããåŸããã¬ãŒã¹ãã«ããŒèŠçŽ ã®ç£èŠã忢ããŸããããã¯ãã³ãŒã«ããã¯ãè€æ°åå®è¡ãããã®ãé²ãããã«éèŠã§ããroot: nullïŒäº€å·®èšç®ã®ã«ãŒãèŠçŽ ãšããŠãã¥ãŒããŒãã䜿çšããŸããrootMargin: '0px'ïŒã«ãŒãèŠçŽ ã®åšãã«ããŒãžã³ã¯è¿œå ãããŸãããããã調æŽããŠãã³ã³ããŒãã³ããå®å šã«è¡šç€ºãããåã«èªã¿èŸŒã¿ãããªã¬ãŒããããšãã§ããŸããäŸãã°ã'200px'ã¯ãã³ã³ããŒãã³ãããã¥ãŒããŒããã200ãã¯ã»ã«é¢ããŠãããšãã«èªã¿èŸŒã¿ãããªã¬ãŒããŸããthreshold: 0.1ïŒã¿ãŒã²ããèŠçŽ ã®10%ã衚瀺ããããšã³ãŒã«ããã¯ãå®è¡ãããŸããéŸå€ã¯0.0ãã1.0ã®ç¯å²ã§ãã³ãŒã«ããã¯ãããªã¬ãŒãããããã«è¡šç€ºãããå¿ èŠãããã¿ãŒã²ããèŠçŽ ã®å²åã衚ããŸããéŸå€0ã¯ãã¿ãŒã²ããã®ãã¯ã»ã«ã1ã€ã§ã衚瀺ããããšããã«ã³ãŒã«ããã¯ãããªã¬ãŒãããããšãæå³ããŸããéŸå€1ã¯ãã¿ãŒã²ããå šäœã衚瀺ããããšãã«ã®ã¿ã³ãŒã«ããã¯ãããªã¬ãŒãããããšãæå³ããŸãã
3. ãã¬ãŒã¹ãã«ããŒèŠçŽ ã®ç£èŠ
次ã«ããã¹ãŠã®ãã¬ãŒã¹ãã«ããŒèŠçŽ ãéžæããIntersection Observerã䜿çšããŠãããã®ç£èŠãéå§ããå¿ èŠããããŸãã
const placeholders = document.querySelectorAll('.component-placeholder');
placeholders.forEach(placeholder => {
observer.observe(placeholder);
});
4. loadComponent颿°ã®å®è£
loadComponent颿°ã¯ãã³ã³ããŒãã³ããåçã«èªã¿èŸŒã¿ããã¬ãŒã¹ãã«ããŒãå®éã®ã³ã³ããŒãã³ãã«çœ®ãæãã圹å²ãæ
ããŸãããã®é¢æ°ã®å®è£
ã¯ã䜿çšããŠããããã³ããšã³ããã¬ãŒã ã¯ãŒã¯ïŒReactãAngularãVueãªã©ïŒãã¢ãžã¥ãŒã«èªã¿èŸŒã¿ã·ã¹ãã ïŒWebpackãParcelãªã©ïŒã«ãã£ãŠç°ãªããŸãã
åçã€ã³ããŒãã䜿çšããäŸïŒã¢ãã³JavaScriptåãïŒïŒ
async function loadComponent(componentName, placeholder) {
try {
const module = await import(`./components/${componentName}.js`);
const Component = module.default;
// Render the component
const componentInstance = new Component(); // Or use a framework-specific rendering method
const componentElement = componentInstance.render(); // Example
// Replace the placeholder with the component
placeholder.parentNode.replaceChild(componentElement, placeholder);
} catch (error) {
console.error(`Error loading component ${componentName}:`, error);
// Handle the error (e.g., display an error message)
placeholder.textContent = 'Error loading component.';
}
}
解説ïŒ
import(`./components/${componentName}.js`)ïŒåçã€ã³ããŒãã䜿çšããŠã³ã³ããŒãã³ãã®JavaScriptã¢ãžã¥ãŒã«ãèªã¿èŸŒã¿ãŸããåçã€ã³ããŒãã«ããããªã³ããã³ãã§ã¢ãžã¥ãŒã«ãèªã¿èŸŒãããšãã§ããããã¯é å»¶èªã¿èŸŒã¿ã«äžå¯æ¬ ã§ãããã¹./components/${componentName}.jsã¯äžäŸã§ããããããžã§ã¯ãã®ãã¡ã€ã«æ§é ã«åãããŠèª¿æŽããå¿ èŠããããŸããmodule.defaultïŒã³ã³ããŒãã³ãã®JavaScriptã¢ãžã¥ãŒã«ããã³ã³ããŒãã³ããããã©ã«ããšã¯ã¹ããŒããšããŠãšã¯ã¹ããŒãããŠããããšãåæãšããŠããŸããnew Component()ïŒã³ã³ããŒãã³ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸããã³ã³ããŒãã³ãã®ã€ã³ã¹ã¿ã³ã¹åãšã¬ã³ããªã³ã°ã®æ¹æ³ã¯ã䜿çšããŠãããã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠç°ãªããŸããcomponentInstance.render()ïŒã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããŠHTMLèŠçŽ ãååŸããæ¹æ³ã®äžäŸã§ããããã¯ãã¬ãŒã ã¯ãŒã¯ã«åºæã§ããplaceholder.parentNode.replaceChild(componentElement, placeholder)ïŒDOMå ã®ãã¬ãŒã¹ãã«ããŒèŠçŽ ãå®éã®ã³ã³ããŒãã³ãèŠçŽ ã«çœ®ãæããŸãã- ãšã©ãŒåŠçïŒã³ã³ããŒãã³ãã®èªã¿èŸŒã¿ãŸãã¯ã¬ã³ããªã³ã°äžã«çºçãããšã©ãŒããã£ããããããã®ãšã©ãŒåŠçãå«ãŸããŠããŸãã
ãã¬ãŒã ã¯ãŒã¯å¥ã®å®è£
Intersection Observerã䜿çšããé å»¶èªã¿èŸŒã¿ã®äžè¬ååã¯ãããŸããŸãªããã³ããšã³ããã¬ãŒã ã¯ãŒã¯ã«å ±éããŠé©çšãããŸãããå ·äœçãªå®è£ ã®è©³çްã¯ç°ãªãå ŽåããããŸãã
React
Reactã§ã¯ãReact.lazy颿°ãSuspenseãšçµã¿åãããŠã³ã³ããŒãã³ããé
å»¶èªã¿èŸŒã¿ã§ããŸããReact.lazy颿°ã¯åçã€ã³ããŒããåŒæ°ãšããŠåãåããã¬ã³ããªã³ã°ããããšãã«ã®ã¿èªã¿èŸŒãŸããã³ã³ããŒãã³ããè¿ããŸããSuspenseã³ã³ããŒãã³ãã¯ãã³ã³ããŒãã³ãã®èªã¿èŸŒã¿äžã«ãã©ãŒã«ããã¯UIã衚瀺ããããã«äœ¿çšãããŸãã
import React, { Suspense } from 'react';
const MyComponent = React.lazy(() => import('./MyComponent'));
function App() {
return (
<div>
<Suspense fallback={<p>Loading...</p>}>
<MyComponent />
</Suspense>
</div>
);
}
ãããã现ããå¶åŸ¡ãè¡ããIntersection Observerãšçµã¿åãããã«ã¯ãã«ã¹ã¿ã ããã¯ãäœæã§ããŸãïŒ
import { useState, useEffect, useRef } from 'react';
function useIntersectionObserver(ref, options) {
const [isIntersecting, setIsIntersecting] = useState(false);
useEffect(() => {
const observer = new IntersectionObserver(
([entry]) => {
setIsIntersecting(entry.isIntersecting);
},
options
);
if (ref.current) {
observer.observe(ref.current);
}
return () => {
if (ref.current) {
observer.unobserve(ref.current);
}
};
}, [ref, options]);
return isIntersecting;
}
function MyComponent() {
const componentRef = useRef(null);
const isVisible = useIntersectionObserver(componentRef, { threshold: 0.1 });
const [loaded, setLoaded] = useState(false);
useEffect(() => {
if (isVisible && !loaded) {
import('./RealComponent').then(RealComponent => {
setLoaded(true);
});
}
}, [isVisible, loaded]);
return (
<div ref={componentRef}>
{loaded ? <RealComponent.default /> : <p>Loading...</p>}
</div>
);
}
Angular
Angularã§ã¯ãåçã€ã³ããŒããšngIfãã£ã¬ã¯ãã£ãã䜿çšããŠã³ã³ããŒãã³ããé
å»¶èªã¿èŸŒã¿ã§ããŸããIntersection Observerã䜿çšããŠã³ã³ããŒãã³ãããã¥ãŒããŒãå
ã«ããããšãæ€åºãããã®åŸã³ã³ããŒãã³ããåçã«èªã¿èŸŒããã£ã¬ã¯ãã£ããäœæã§ããŸãã
import { Directive, ElementRef, AfterViewInit, OnDestroy, ViewContainerRef, Input } from '@angular/core';
@Directive({
selector: '[appLazyLoad]'
})
export class LazyLoadDirective implements AfterViewInit, OnDestroy {
@Input('appLazyLoad') componentPath: string;
private observer: IntersectionObserver;
constructor(private el: ElementRef, private viewContainer: ViewContainerRef) { }
ngAfterViewInit() {
this.observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
this.observer.unobserve(this.el.nativeElement);
this.loadComponent();
}
}, { threshold: 0.1 });
this.observer.observe(this.el.nativeElement);
}
ngOnDestroy() {
if (this.observer) {
this.observer.disconnect();
}
}
async loadComponent() {
try {
const { Component } = await import(this.componentPath);
this.viewContainer.createComponent(Component);
} catch (error) {
console.error('Error loading component', error);
}
}
}
ãã³ãã¬ãŒãã§ã®äœ¿çšæ³ïŒ
<div *appLazyLoad="'./my-component.component'"></div>
Vue.js
Vue.jsã§ã¯ãåçã³ã³ããŒãã³ããš<component>ã¿ã°ã䜿çšããŠã³ã³ããŒãã³ããé
å»¶èªã¿èŸŒã¿ã§ããŸãããŸããIntersection Observer APIã䜿çšããŠãã³ã³ããŒãã³ãããã¥ãŒããŒãã«å
¥ã£ããšãã«ãã®èªã¿èŸŒã¿ãããªã¬ãŒããããšãã§ããŸãã
<template>
<div ref="container">
<component :is="loadedComponent"></component>
</div>
</template>
<script>
import { defineComponent, ref, onMounted, onBeforeUnmount } from 'vue';
export default defineComponent({
setup() {
const container = ref(null);
const loadedComponent = ref(null);
let observer = null;
const loadComponent = async () => {
try {
const module = await import('./MyComponent.vue');
loadedComponent.value = module.default;
} catch (error) {
console.error('Error loading component', error);
}
};
onMounted(() => {
observer = new IntersectionObserver(([entry]) => {
if (entry.isIntersecting) {
loadComponent();
observer.unobserve(container.value);
}
}, { threshold: 0.1 });
observer.observe(container.value);
});
onBeforeUnmount(() => {
if (observer) {
observer.unobserve(container.value);
observer.disconnect();
}
});
return {
container,
loadedComponent,
};
},
});
</script>
ã³ã³ããŒãã³ãé å»¶èªã¿èŸŒã¿ã®ãã¹ããã©ã¯ãã£ã¹
ã³ã³ããŒãã³ãã®é å»¶èªã¿èŸŒã¿ã®å©ç¹ãæå€§åããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãæ€èšããŠãã ããïŒ
- åè£ã®ç¹å®ïŒé å»¶èªã¿èŸŒã¿ã«é©ããã³ã³ããŒãã³ããæ éã«ç¹å®ããŸãããããã¯éåžžãããŒãžã®åæã¬ã³ããªã³ã°ã«äžå¯æ¬ ã§ã¯ãªãããŸãã¯ã¹ã¯ããŒã«ããªããšèŠããªãå Žæã«ããã³ã³ããŒãã³ãã§ãã
- æå³ã®ãããã¬ãŒã¹ãã«ããŒã®äœ¿çšïŒé å»¶èªã¿èŸŒã¿ãããã³ã³ããŒãã³ãã«æå³ã®ãããã¬ãŒã¹ãã«ããŒãæäŸããŸããããã¯ãããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãã¹ã±ã«ãã³UIããŸãã¯ã³ã³ããŒãã³ãã®ç°¡ç¥çã«ããããšãã§ããŸãããã¬ãŒã¹ãã«ããŒã¯ããŠãŒã¶ãŒã«ã³ã³ããŒãã³ããèªã¿èŸŒã¿äžã§ããããšãèŠèŠçã«ç€ºããã³ã³ããŒãã³ããèªã¿èŸŒãŸããéã®ã³ã³ãã³ãã®ãããé²ãã¹ãã§ãã
- ã³ã³ããŒãã³ãã³ãŒãã®æé©åïŒé å»¶èªã¿èŸŒã¿ãè¡ãåã«ãã³ã³ããŒãã³ããããã©ãŒãã³ã¹ã®ããã«ååã«æé©åãããŠããããšã確èªããŠãã ãããèªã¿èŸŒã¿ã»å®è¡ãå¿ èŠãªJavaScriptãšCSSã®éãæå°éã«æããŸããã³ãŒãåå²ãããªãŒã·ã§ã€ãã³ã°ãªã©ã®æè¡ã䜿çšããŠäžèŠãªã³ãŒããåé€ããŸãã
- ããã©ãŒãã³ã¹ã®ç£èŠïŒé å»¶èªã¿èŸŒã¿ãå®è£ ããåŸããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãç¶ç¶çã«ç£èŠããŸããGoogle PageSpeed InsightsãWebPageTestãªã©ã®ããŒã«ã䜿çšããŠãèªã¿èŸŒã¿æéãååã³ã³ãã³ãæç»ãã€ã³ã¿ã©ã¯ãã£ãã«ãªããŸã§ã®æéãªã©ã®ã¡ããªã¯ã¹ã远跡ããŸããããã©ãŒãã³ã¹ãæé©åããããã«ãå¿ èŠã«å¿ããŠé å»¶èªã¿èŸŒã¿æŠç¥ã調æŽããŸãã
- 培åºçãªãã¹ãïŒé å»¶èªã¿èŸŒã¿ã®å®è£ ãããŸããŸãªããã€ã¹ããã©ãŠã¶ã§åŸ¹åºçã«ãã¹ãããŸããã³ã³ããŒãã³ããæ£ããèªã¿èŸŒãŸãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãã¹ã ãŒãºã§ã·ãŒã ã¬ã¹ã§ããããšã確èªããŠãã ããã
- ã¢ã¯ã»ã·ããªãã£ã®èæ ®ïŒé å»¶èªã¿èŸŒã¿ã®å®è£ ããé害ãæã€ãŠãŒã¶ãŒãå«ããã¹ãŠã®ãŠãŒã¶ãŒã«ãšã£ãŠã¢ã¯ã»ã¹å¯èœã§ããããšã確èªããŸããJavaScriptãç¡å¹ã«ãªã£ãŠãããŠãŒã¶ãŒãæ¯æŽæè¡ã䜿çšããŠãããŠãŒã¶ãŒã®ããã«ã代æ¿ã³ã³ãã³ããæäŸããŸãã
çµè«
Intersection Observer APIã䜿çšããããã³ããšã³ãã³ã³ããŒãã³ãã®é å»¶èªã¿èŸŒã¿ã¯ããŠã§ããµã€ãã®ããã©ãŒãã³ã¹ãæé©åãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããããã®åŒ·åãªãã¯ããã¯ã§ããéèŠã§ãªãã³ã³ããŒãã³ãã®èªã¿èŸŒã¿ãé ãããããšã§ãåæèªã¿èŸŒã¿æéãå€§å¹ ã«ççž®ãã垯åå¹ ãç¯çŽãããŠã§ããµã€ãå šäœã®å¿çæ§ãåäžãããããšãã§ããŸãã
ãã®èšäºã§æŠèª¬ããæé ã«åŸãããã¹ããã©ã¯ãã£ã¹ãéµå®ããããšã§ããããžã§ã¯ãã«ã³ã³ããŒãã³ãã®é å»¶èªã¿èŸŒã¿ã广çã«å®è£ ããå Žæãããã€ã¹ã«é¢ä¿ãªãããŠãŒã¶ãŒã«ããéããããã¹ã ãŒãºã§ãããæ¥œããäœéšãæäŸã§ããŸãã
ããã³ããšã³ããã¬ãŒã ã¯ãŒã¯ãšãããžã§ã¯ãã®èŠä»¶ã«æãé©ããå®è£ æŠç¥ãéžæããããšãå¿ããªãã§ãã ãããããã©ãŒãã³ã¹ãããã«æé©åããããã«ãã³ãŒãåå²ãããªãŒã·ã§ã€ãã³ã°ãªã©ã®æè¡ãçµã¿åãããŠäœ¿çšããããšãæ€èšããŠãã ããããããŠãåžžã«å®è£ ãç£èŠã»ãã¹ãããŠãæãŸããçµæãåŸãããŠããããšã確èªããŠãã ããã
ã³ã³ããŒãã³ãã®é å»¶èªã¿èŸŒã¿ãåãå ¥ããããšã§ãèŠèŠçã«é åçã§ããã ãã§ãªããéåžžã«é«æ§èœã§ãŠãŒã¶ãŒãã¬ã³ããªãŒãªãŠã§ããµã€ããæ§ç¯ã§ãããã¹ãŠã®äººã«ãšã£ãŠããè¯ããŠã§ãäœéšå šäœã«è²¢ç®ã§ããŸãã